package org.dromara.common.core.utils.regex

import cn.hutool.core.exceptions.ValidateException
import cn.hutool.core.lang.Validator
import org.dromara.common.core.factory.RegexPatternPoolFactory

/**
 * 正则字段校验器
 * 主要验证字段非空、是否为满足指定格式等
 *
 *@author LikeYouDo
 *@date 2025/1/6 10:05
 */
object RegexValidator {
    /**
     * 字典类型必须以字母开头，且只能为（小写字母，数字，下滑线）
     */
    @JvmField
    val DICTIONARY_TYPE = RegexPatternPoolFactory.DICTIONARY_TYPE

    /**
     * 身份证号码（后6位）
     */
    @JvmField
    val ID_CARD_LAST_6 = RegexPatternPoolFactory.ID_CARD_LAST_6

    /**
     * QQ号码
     */
    @JvmField
    val QQ_NUMBER = RegexPatternPoolFactory.QQ_NUMBER

    /**
     * 邮政编码
     */
    @JvmField
    val POSTAL_CODE = RegexPatternPoolFactory.POSTAL_CODE

    /**
     * 注册账号
     */
    @JvmField
    val ACCOUNT = RegexPatternPoolFactory.ACCOUNT

    /**
     * 密码：包含至少8个字符，包括大写字母、小写字母、数字和特殊字符
     */
    @JvmField
    val PASSWORD = RegexPatternPoolFactory.PASSWORD

    /**
     * 通用状态（0表示正常，1表示停用）
     */
    @JvmField
    val STATUS = RegexPatternPoolFactory.STATUS


    /**
     * 检查输入的账号是否匹配预定义的规则
     *
     * @param value 要验证的账号
     * @return 如果账号符合规则，返回 true；否则，返回 false。
     */
    @JvmStatic
    fun isAccount(value: CharSequence?): Boolean =
        Validator.isMatchRegex(ACCOUNT, value)

    /**
     * 验证输入的账号是否符合规则，如果不符合，则抛出 ValidateException 异常
     *
     * @param value    要验证的账号
     * @param errorMsg 验证失败时抛出的异常消息
     * @param <T>      CharSequence 的子类型
     * @return 如果验证通过，返回输入的账号
     * @throws ValidateException 如果验证失败
     */
    @JvmStatic
    @Throws(ValidateException::class)
    fun <T : CharSequence?> validateAccount(value: T, errorMsg: String?): T {
        if (!isAccount(value)) {
            throw ValidateException(errorMsg)
        }
        return value
    }

    /**
     * 检查输入的状态是否匹配预定义的规则
     *
     * @param value 要验证的状态
     * @return 如果状态符合规则，返回 true；否则，返回 false。
     */
    @JvmStatic
    fun isStatus(value: CharSequence?): Boolean =
        Validator.isMatchRegex(STATUS, value)

    /**
     * 验证输入的状态是否符合规则，如果不符合，则抛出 ValidateException 异常
     *
     * @param value    要验证的状态
     * @param errorMsg 验证失败时抛出的异常消息
     * @param <T>      CharSequence 的子类型
     * @return 如果验证通过，返回输入的状态
     * @throws ValidateException 如果验证失败
     */
    @JvmStatic
    @Throws(ValidateException::class)
    fun <T : CharSequence?> validateStatus(value: T, errorMsg: String?): T {
        if (!isStatus(value)) {
            throw ValidateException(errorMsg)
        }
        return value
    }
}
